package com.bluedot.www.core.utils;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Date;
import java.sql.Timestamp;

/**
 * @author Ding YuXing
 * @version 1.0
 * @date 2021/8/21 16:36
 */
public class IpUtil {

    Logger logger = LoggerFactory.getLogger(IpUtil.class);

    /**
     * 将IP地址（IPV4）字符串转换为 int类型的数字
     * <p>
     * 思路:将 IP地址（IPV4）的每一段数字转为 8 位二进制数，并将它们放在结果的适当位置上
     *
     * @param ipv4String（IPV4） 字符串，如 127.0.0.1
     * @return IP地址（IPV4）  字符串对应的 int值
     */
    public static Long ipv4ToInt(String ipv4String) {
        // 取 ip 的各段
        String[] ipSlices = ipv4String.split("\\.");
        Long result = 0L;
        for (int i = 0; i < ipSlices.length; i++) {
            // 将 ip 的每一段解析为 int，并根据位置左移 8 位
            int intSlice = Integer.parseInt(ipSlices[i]) << 8 * i;
            // 求或
            result = result | intSlice;
        }
        return result;
    }

    /**
     * 将 int类型的数字转换为IP地址（IPV4）字符串
     *
     * @param ipv4Int 用 int表示的IP地址（IPV4）字符串
     * @return IP地址（IPV4）字符串，如 127.0.0.1
     */
    public static String intToIpv4(Long ipv4Int) {
        String[] ipString = new String[4];
        for (int i = 0; i < 4; i++) {
            // 每 8 位为一段，这里取当前要处理的最高位的位置
            int pos = i * 8;
            // 取当前处理的 ip 段的值
            long and = ipv4Int & (255L << pos);
            // 将当前 ip 段转换为 0 ~ 255 的数字，注意这里必须使用无符号右移
            ipString[i] = String.valueOf(and >>> pos);
        }
        return String.join(".", ipString);
    }

    public static void main(String[] args) {
        String ipv4String = "192.0.0.1";

        Long ipv4Int = ipv4ToInt(ipv4String);

        System.out.println(ipv4String + "对应的int值为：" + ipv4Int);

        //测试日志
        new IpUtil().logger.debug("fdgdfsgd");

        System.out.println(ipv4Int + "对应的ip值为：" + intToIpv4(16777343L));

        Date date = new Date(12346);
        System.out.println(date);

        Timestamp timestamp = new Timestamp(135465456);
        System.out.println(timestamp);


    }
}
